#管理游戏资源和行为的类
import sys

import pygame

from star import Star
from settings import Settings


class starInvasion:

    #初始化资源
    def __init__(self):
        pygame.init()

        #设置属性
        #设置对象
        self.settings=Settings()
        '''
            全屏模式代码
            self.screen=pygame.display.set_mode((0,0),pygame.FULLSCREEN)
            #更新设置类的属性
            self.settings.screen_width=self.screen.get_rect().width
            self.settings.screen_height = self.screen.get_rect().height
        '''

        self.screen=pygame.display.set_mode(
            (self.settings.screen_width,self.settings.screen_height))
        #设置标题名
        pygame.display.set_caption("stars")

        #外星人舰队
        self.stars=pygame.sprite.Group()
        #创建舰队
        self._create_fleet()


    #运行游戏的方法
    def run_game(self):

        while True:
            #监视键盘和鼠标事件
            #监视并更新事件
            self._check_events()

            #监视并更新屏幕
            self._update_screen()


    # 创建外星人舰队
    def _create_fleet(self):

        #计算一行放置的个数
        #创建一个外星人并计算一行可容纳多少个外星人
        # 这里写s为30，因为star(self).rect.width不是真实的宽度
        # 我们将其转换为了30*30的尺寸
        star_width,star_height=30,30
        #减去两边后的可用空间
        available_space_x=self.settings.screen_width-(2*star_width)
        #每个外星人占两格，中间有空隙，以此计算一行外星人的个数
        number_stars_x=available_space_x//(2*star_width)

        #计算可以放多少行
        #可用空间
        available_space_y=(self.settings.screen_height-(2*star_height))
        number_rows=available_space_y//(2*star_height)

        for row_number in range(number_rows):
            # 创建一行外星人
            for star_number in range(number_stars_x):
                # 创建一个外星人并加入当前行
                self._create_star(star_number,row_number)

    #创建一个外星人并加入当前行
    def _create_star(self,star_number,row_number):
        # 创建一个外星人并加入当前行
        star = Star(self)
        star_width,star_height=30,30
        star.rect.x = star_width + 2 * star_width * star_number
        star.rect.y=star_height+2*star_height*row_number
        self.stars.add(star)


    # 监视并更新屏幕
    def _update_screen(self):
        # 填充背景颜色
        self.screen.fill(self.settings.bg_color)
        # 绘制外星人编组
        '''
            对编组调用draw()时，Pygame 将把编组中的每个元素绘制到属性rect 指定的位置。方法
            draw()接受一个参数，这个参数指定了要将编组中的元素绘制到哪个surface 上。
        '''
        self.stars.draw(self.screen)
        # 让最新的屏幕可见
        pygame.display.flip()


    #响应案件和鼠标事件
    def _check_events(self):
        for event in pygame.event.get():
            #如果是退出
            if event.type == pygame.QUIT:
                sys.exit()
            #如果是按键按下
            elif event.type==pygame.KEYDOWN:
                self._check_keydown_events(event)

    #响应按键按下
    def _check_keydown_events(self,event):
        # 如果按Q键
        if event.key == pygame.K_q:
            sys.exit()



#运行游戏
starInvasion().run_game()
